package main

import "fmt"

// 数组操作：声明、赋值、访问
func main() {
	//声明一个长度为10的数组
	var n [10]int

	//为数组n初始化元素
	for i := 0; i < 10; i++ {
		//设置元素为i+100
		n[i] = i + 100
	}

	//输出每个数组元素的值
	for j := 0; j < 10; j++ {
		fmt.Printf("Element[%d] = %d\n", j, n[j])
	}

	println("========================================")
	arrayTest02()
	println("========================================")
	two_dimensional_array()
	println("========================================")
	two_dimensional_array02()
	println("========================================")
	two_dimensional_array03()

	println("========================================")
	println("向函数传递数组")
	//数组长度为5
	var balance = [5]int{1000, 2, 3, 17, 50}
	var avg float32
	//数组作为参数传递给函数
	avg = getAverage(balance, 5)
	//输出返回的平均值
	fmt.Printf("平均值为：%f ", avg)
}

func arrayTest02() {
	var i, j, k int
	//声明数组的同时快速初始化数组
	balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
	//输出数组元素
	for i = 0; i < 5; i++ {
		fmt.Printf("balance[%d] = %f\n", i, balance[i])
	}

	balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
	//输出每个数组元素的值
	for j = 0; j < 5; j++ {
		fmt.Printf("balance2[%d] = %f\n", j, balance2[j])
	}

	//将索引为1和3的元素初始化
	balance3 := [5]float32{1: 2.0, 3: 7.0}
	for k = 0; k < 5; k++ {
		fmt.Printf("balance3[%d] = %f\n", k, balance3[k])
	}
}

// 二维数组
func two_dimensional_array() {
	//Step1 创建数组
	values := [][]int{}

	//Step2 使用append()函数向空的二维数组添加两行一维数组
	row1 := []int{1, 2, 3}
	row2 := []int{4, 5, 6}
	values = append(values, row1)
	values = append(values, row2)

	//Step3 显示两行数据
	fmt.Println("row1")
	fmt.Println(values[0])
	fmt.Println("row2")
	fmt.Println(values[1])

	//Step4 访问第一个元素
	fmt.Println("第一个元素为：")
	fmt.Println(values[0][0])
}

// 二维数组：初始化一个2行2列的二维数组
func two_dimensional_array02() {
	//创建二维数组
	sites := [2][2]string{}

	//向二维数组添加元素
	sites[0][0] = "Google"
	sites[0][1] = "Runoob"
	sites[1][0] = "Taobao"
	sites[1][1] = "Weibo"

	//显示结果
	fmt.Println(sites)
}

// 访问二维数组
func two_dimensional_array03() {
	//数组 5行2列
	var a = [5][2]int{{0, 0}, {1, 2}, {2, 4}, {3, 6}, {4, 8}}
	var i, j int

	//输出数组元素
	for i = 0; i < 5; i++ {
		for j = 0; j < 2; j++ {
			fmt.Printf("a[%d][%d] = %d\n", i, j, a[i][j])
		}
	}
}

// 向函数传递数组
// 函数接收整型数组参数，另一个参数指定了数组元素的个数，并返回平均值
func getAverage(arr [5]int, size int) float32 {
	var i, sum int
	var avg float32

	for i = 0; i < size; i++ {
		sum += arr[i]
	}

	avg = float32(sum) / float32(size)

	return avg
}
